use super::into_iter::IntoIter;
use super::iter::Iter;
use super::iter_mut::IterMut;

/// 栈
///
#[derive(Debug)]
pub struct Stack<T> {
    // 栈大小
    pub size: usize,
    // 栈数据
    pub data: Vec<T>,
}

impl<T> Stack<T> {
    // 初始化空栈
    pub fn new() -> Self {
        Self {
            size: 0,
            data: Vec::new(),
        }
    }

    pub fn is_empty(&self) -> bool {
        0 == self.size
    }

    pub fn len(&self) -> usize {
        self.size
    }

    //清空栈
    pub fn clear(&mut self) {
        self.size = 0;
        self.data.clear();
    }

    // 将数据保存在Vec的末尾
    pub fn push(&mut self, item: T) {
        self.data.push(item);
        self.size += 1;
    }

    // 在栈顶减1后，弹出数据
    pub fn pop(&mut self) -> Option<T> {
        if 0 == self.size {
            return None;
        }
        self.size -= 1;
        self.data.pop()
    }

    //返回栈顶数据引用和可变引用
    pub fn peek(&self) -> Option<&T> {
        if 0 == self.size {
            return None;
        }
        self.data.get(self.size - 1)
    }

    pub fn peek_mut(&mut self) -> Option<&mut T> {
        if 0 == self.size {
            return None;
        }
        self.data.get_mut(self.size - 1)
    }

    // 以下是为栈实现的迭代功能
    // into_iter: 栈改变，成为迭代器
    // iter: 栈不变，得到不可变迭代器
    // iter_mut: 栈不变，得到可变迭代器

    pub fn into_iter(self) -> IntoIter<T> {
        IntoIter::new(self)
    }

    pub fn iter(&self) -> Iter<T> {
        let mut iterator = Iter { stack: Vec::new() };
        for item in self.data.iter() {
            iterator.stack.push(item);
        }
        iterator
    }

    pub fn iter_mut(&mut self) -> IterMut<T> {
        let mut iterator = IterMut { stack: Vec::new() };
        for item in self.data.iter_mut() {
            iterator.stack.push(item);
        }
        iterator
    }
}

impl<T: Clone> Clone for Stack<T> {
    fn clone(&self) -> Self {
        let mut v = Vec::new();
        for item in self.data.iter() {
            v.push(item.clone());
        }
        Self {
            size: self.size,
            data: v,
        }
    }
}
